/**
 * 数据库架构定义
 * 定义所有数据表结构和索引
 */

/**
 * 照片表结构
 */
export interface PhotoRecord {
  id: string;                    // 唯一标识符
  filename: string;              // 文件名
  filepath: string;              // 完整文件路径
  filesize: number;              // 文件大小（字节）
  filehash: string;              // 文件内容哈希值（用于去重）
  mimetype: string;              // MIME 类型
  width: number;                 // 图片宽度
  height: number;                // 图片高度
  created_at: string;            // 文件创建时间
  modified_at: string;           // 文件修改时间
  taken_at?: string;             // 拍摄时间（从 EXIF 提取）
  imported_at: string;           // 导入时间
  updated_at: string;            // 记录更新时间
  
  // EXIF 元数据
  camera_make?: string;          // 相机制造商
  camera_model?: string;         // 相机型号
  lens_model?: string;           // 镜头型号
  focal_length?: number;         // 焦距
  aperture?: number;             // 光圈值
  shutter_speed?: string;        // 快门速度
  iso?: number;                  // ISO 值
  flash?: boolean;               // 是否使用闪光灯
  
  // GPS 信息
  latitude?: number;             // 纬度
  longitude?: number;            // 经度
  altitude?: number;             // 海拔
  location_name?: string;        // 地点名称
  
  // 用户标记
  favorite: boolean;             // 是否收藏
  rating: number;                // 评分（0-5）
  tags: string;                  // 标签（JSON 字符串）
  description?: string;          // 描述
  
  // 状态信息
  thumbnail_generated: boolean;  // 是否已生成缩略图
  metadata_extracted: boolean;   // 是否已提取元数据
  deleted: boolean;              // 是否已删除（软删除）
}

/**
 * 文件夹表结构
 */
export interface FolderRecord {
  id: string;                    // 唯一标识符
  path: string;                  // 文件夹路径
  name: string;                  // 文件夹名称
  parent_id?: string;            // 父文件夹 ID
  photo_count: number;           // 包含的照片数量
  last_scanned: string;          // 最后扫描时间
  watch_enabled: boolean;        // 是否启用监听
  created_at: string;            // 创建时间
  updated_at: string;            // 更新时间
}

/**
 * 相册表结构
 */
export interface AlbumRecord {
  id: string;                    // 唯一标识符
  name: string;                  // 相册名称
  description?: string;          // 相册描述
  cover_photo_id?: string;       // 封面照片 ID
  photo_count: number;           // 照片数量
  created_at: string;            // 创建时间
  updated_at: string;            // 更新时间
}

/**
 * 相册照片关联表结构
 */
export interface AlbumPhotoRecord {
  id: string;                    // 唯一标识符
  album_id: string;              // 相册 ID
  photo_id: string;              // 照片 ID
  added_at: string;              // 添加时间
  order_index: number;           // 排序索引
}

/**
 * 标签表结构
 */
export interface TagRecord {
  id: string;                    // 唯一标识符
  name: string;                  // 标签名称
  color?: string;                // 标签颜色
  photo_count: number;           // 使用该标签的照片数量
  created_at: string;            // 创建时间
  updated_at: string;            // 更新时间
}

/**
 * 照片标签关联表结构
 */
export interface PhotoTagRecord {
  id: string;                    // 唯一标识符
  photo_id: string;              // 照片 ID
  tag_id: string;                // 标签 ID
  added_at: string;              // 添加时间
}

/**
 * 导入任务表结构
 */
export interface ImportTaskRecord {
  id: string;                    // 唯一标识符
  folder_path: string;           // 导入的文件夹路径
  status: 'pending' | 'running' | 'completed' | 'failed' | 'cancelled'; // 任务状态
  total_files: number;           // 总文件数
  processed_files: number;       // 已处理文件数
  imported_files: number;        // 成功导入文件数
  skipped_files: number;         // 跳过的文件数
  error_files: number;           // 错误文件数
  error_message?: string;        // 错误信息
  started_at?: string;           // 开始时间
  completed_at?: string;         // 完成时间
  created_at: string;            // 创建时间
  updated_at: string;            // 更新时间
}

/**
 * 系统设置表结构
 */
export interface SettingRecord {
  key: string;                   // 设置键
  value: string;                 // 设置值（JSON 字符串）
  type: 'string' | 'number' | 'boolean' | 'object'; // 值类型
  description?: string;          // 设置描述
  updated_at: string;            // 更新时间
}

/**
 * 数据库表定义
 */
export const DATABASE_TABLES = {
  photos: `
    CREATE TABLE IF NOT EXISTS photos (
      id TEXT PRIMARY KEY,
      filename TEXT NOT NULL,
      filepath TEXT NOT NULL UNIQUE,
      filesize INTEGER NOT NULL,
      filehash TEXT NOT NULL,
      mimetype TEXT NOT NULL,
      width INTEGER NOT NULL,
      height INTEGER NOT NULL,
      created_at TEXT NOT NULL,
      modified_at TEXT NOT NULL,
      taken_at TEXT,
      imported_at TEXT NOT NULL,
      updated_at TEXT NOT NULL,
      
      camera_make TEXT,
      camera_model TEXT,
      lens_model TEXT,
      focal_length REAL,
      aperture REAL,
      shutter_speed TEXT,
      iso INTEGER,
      flash INTEGER DEFAULT 0,
      
      latitude REAL,
      longitude REAL,
      altitude REAL,
      location_name TEXT,
      
      favorite INTEGER DEFAULT 0,
      rating INTEGER DEFAULT 0,
      tags TEXT DEFAULT '[]',
      description TEXT,
      
      thumbnail_generated INTEGER DEFAULT 0,
      metadata_extracted INTEGER DEFAULT 0,
      deleted INTEGER DEFAULT 0
    )
  `,
  
  folders: `
    CREATE TABLE IF NOT EXISTS folders (
      id TEXT PRIMARY KEY,
      path TEXT NOT NULL UNIQUE,
      name TEXT NOT NULL,
      parent_id TEXT,
      photo_count INTEGER DEFAULT 0,
      last_scanned TEXT,
      watch_enabled INTEGER DEFAULT 1,
      created_at TEXT NOT NULL,
      updated_at TEXT NOT NULL,
      FOREIGN KEY (parent_id) REFERENCES folders (id)
    )
  `,
  
  albums: `
    CREATE TABLE IF NOT EXISTS albums (
      id TEXT PRIMARY KEY,
      name TEXT NOT NULL,
      description TEXT,
      cover_photo_id TEXT,
      photo_count INTEGER DEFAULT 0,
      created_at TEXT NOT NULL,
      updated_at TEXT NOT NULL,
      FOREIGN KEY (cover_photo_id) REFERENCES photos (id)
    )
  `,
  
  album_photos: `
    CREATE TABLE IF NOT EXISTS album_photos (
      id TEXT PRIMARY KEY,
      album_id TEXT NOT NULL,
      photo_id TEXT NOT NULL,
      added_at TEXT NOT NULL,
      order_index INTEGER DEFAULT 0,
      FOREIGN KEY (album_id) REFERENCES albums (id) ON DELETE CASCADE,
      FOREIGN KEY (photo_id) REFERENCES photos (id) ON DELETE CASCADE,
      UNIQUE (album_id, photo_id)
    )
  `,
  
  tags: `
    CREATE TABLE IF NOT EXISTS tags (
      id TEXT PRIMARY KEY,
      name TEXT NOT NULL UNIQUE,
      color TEXT,
      photo_count INTEGER DEFAULT 0,
      created_at TEXT NOT NULL,
      updated_at TEXT NOT NULL
    )
  `,
  
  photo_tags: `
    CREATE TABLE IF NOT EXISTS photo_tags (
      id TEXT PRIMARY KEY,
      photo_id TEXT NOT NULL,
      tag_id TEXT NOT NULL,
      added_at TEXT NOT NULL,
      FOREIGN KEY (photo_id) REFERENCES photos (id) ON DELETE CASCADE,
      FOREIGN KEY (tag_id) REFERENCES tags (id) ON DELETE CASCADE,
      UNIQUE (photo_id, tag_id)
    )
  `,
  
  import_tasks: `
    CREATE TABLE IF NOT EXISTS import_tasks (
      id TEXT PRIMARY KEY,
      folder_path TEXT NOT NULL,
      status TEXT NOT NULL DEFAULT 'pending',
      total_files INTEGER DEFAULT 0,
      processed_files INTEGER DEFAULT 0,
      imported_files INTEGER DEFAULT 0,
      skipped_files INTEGER DEFAULT 0,
      error_files INTEGER DEFAULT 0,
      error_message TEXT,
      started_at TEXT,
      completed_at TEXT,
      created_at TEXT NOT NULL,
      updated_at TEXT NOT NULL
    )
  `,
  
  settings: `
    CREATE TABLE IF NOT EXISTS settings (
      key TEXT PRIMARY KEY,
      value TEXT NOT NULL,
      type TEXT NOT NULL DEFAULT 'string',
      description TEXT,
      updated_at TEXT NOT NULL
    )
  `
};

/**
 * 数据库索引定义
 */
export const DATABASE_INDEXES = [
  // 照片表索引
  'CREATE INDEX IF NOT EXISTS idx_photos_filepath ON photos (filepath)',
  'CREATE INDEX IF NOT EXISTS idx_photos_filehash ON photos (filehash)',
  'CREATE INDEX IF NOT EXISTS idx_photos_taken_at ON photos (taken_at)',
  'CREATE INDEX IF NOT EXISTS idx_photos_imported_at ON photos (imported_at)',
  'CREATE INDEX IF NOT EXISTS idx_photos_favorite ON photos (favorite)',
  'CREATE INDEX IF NOT EXISTS idx_photos_rating ON photos (rating)',
  'CREATE INDEX IF NOT EXISTS idx_photos_deleted ON photos (deleted)',
  'CREATE INDEX IF NOT EXISTS idx_photos_mimetype ON photos (mimetype)',
  
  // 文件夹表索引
  'CREATE INDEX IF NOT EXISTS idx_folders_path ON folders (path)',
  'CREATE INDEX IF NOT EXISTS idx_folders_parent_id ON folders (parent_id)',
  
  // 相册照片关联表索引
  'CREATE INDEX IF NOT EXISTS idx_album_photos_album_id ON album_photos (album_id)',
  'CREATE INDEX IF NOT EXISTS idx_album_photos_photo_id ON album_photos (photo_id)',
  'CREATE INDEX IF NOT EXISTS idx_album_photos_order ON album_photos (album_id, order_index)',
  
  // 照片标签关联表索引
  'CREATE INDEX IF NOT EXISTS idx_photo_tags_photo_id ON photo_tags (photo_id)',
  'CREATE INDEX IF NOT EXISTS idx_photo_tags_tag_id ON photo_tags (tag_id)',
  
  // 导入任务表索引
  'CREATE INDEX IF NOT EXISTS idx_import_tasks_status ON import_tasks (status)',
  'CREATE INDEX IF NOT EXISTS idx_import_tasks_created_at ON import_tasks (created_at)'
];

/**
 * 数据库版本和迁移信息
 */
export const DATABASE_VERSION = 1;
export const DATABASE_NAME = 'photos.db';